home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / StdioFileWriteProc.c,v < prev    next >
Text File  |  1991-12-02  |  8KB  |  330 lines

  1. head     1.7;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.7.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.7
  10. date     90.09.11.14.27.21;  author kupfer;  state Exp;
  11. branches 1.7.1.1;
  12. next     1.6;
  13.  
  14. 1.6
  15. date     90.02.08.17.19.05;  author jhh;  state Exp;
  16. branches ;
  17. next     1.5;
  18.  
  19. 1.5
  20. date     89.06.19.14.15.12;  author jhh;  state Exp;
  21. branches ;
  22. next     1.4;
  23.  
  24. 1.4
  25. date     88.07.28.17.18.31;  author ouster;  state Exp;
  26. branches ;
  27. next     1.3;
  28.  
  29. 1.3
  30. date     88.07.25.14.12.40;  author ouster;  state Exp;
  31. branches ;
  32. next     1.2;
  33.  
  34. 1.2
  35. date     88.07.20.18.12.12;  author ouster;  state Exp;
  36. branches ;
  37. next     1.1;
  38.  
  39. 1.1
  40. date     88.06.10.16.23.33;  author ouster;  state Exp;
  41. branches ;
  42. next     ;
  43.  
  44. 1.7.1.1
  45. date     91.12.02.19.54.26;  author kupfer;  state Exp;
  46. branches ;
  47. next     ;
  48.  
  49.  
  50. desc
  51. @@
  52.  
  53.  
  54. 1.7
  55. log
  56. @Use function prototypes. Lint.
  57. @
  58. text
  59. @/* 
  60.  * StdioFileWriteProc.c --
  61.  *
  62.  *    Source code for the "StdioFileWriteProc" library procedure.
  63.  *
  64.  * Copyright 1988 Regents of the University of California
  65.  * Permission to use, copy, modify, and distribute this
  66.  * software and its documentation for any purpose and without
  67.  * fee is hereby granted, provided that the above copyright
  68.  * notice appear in all copies.  The University of California
  69.  * makes no representations about the suitability of this
  70.  * software for any purpose.  It is provided "as is" without
  71.  * express or implied warranty.
  72.  */
  73.  
  74. #ifndef lint
  75. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileWriteProc.c,v 1.6 90/02/08 17:19:05 jhh Exp Locker: kupfer $ SPRITE (Berkeley)"; 
  76. #endif not lint
  77.  
  78. #include "stdio.h"
  79. #include "fileInt.h"
  80. #include "stdlib.h"
  81. #include <errno.h>
  82. #include <unistd.h>
  83.  
  84. /*
  85.  * Before the first I/O on stdin, stdout, or stderr their buffers
  86.  * aren't initialized.  For the output streams, there must be someplace
  87.  * to buffer the first character, temporarily, until the buffer-flush
  88.  * routine is called.  That's what the variable below is for.
  89.  */
  90.  
  91. unsigned char stdioTempBuffer[4];
  92.  
  93. /*
  94.  * Stderr cannot have a dynamically allocated buffer since we may end
  95.  * up calling malloc at at bad time (like inside of panic in the kernel).
  96.  * Allocate a static buffer for stderr.
  97.  */
  98.  
  99. unsigned char stdioStderrBuffer[128];
  100.  
  101. /*
  102.  * Space is allocated here for the structures for stdin, stdout, and
  103.  * stderr, and also for the array that holds pointers to all the
  104.  * streams asociated with files.
  105.  */
  106.  
  107. FILE stdioInFile = {
  108.     0, 0, 0, 0, 0,
  109.     StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  110.     (ClientData) 0, 0, STDIO_READ, NULL
  111. };
  112.  
  113. FILE stdioOutFile = {
  114.     stdioTempBuffer-1, 0, 0, stdioTempBuffer, 0,
  115.     StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  116.     (ClientData) 1, 0, STDIO_WRITE, &stdioInFile
  117. };
  118.  
  119. FILE stdioErrFile = {
  120.     stdioTempBuffer-1, 0, 0, stdioTempBuffer, 0,
  121.     StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  122.     (ClientData) 2, 0, STDIO_WRITE, &stdioOutFile
  123. };
  124.  
  125. FILE *stdioFileStreams = &stdioErrFile;
  126.  
  127. /*
  128.  *----------------------------------------------------------------------
  129.  *
  130.  * StdioFileWriteProc --
  131.  *
  132.  *    This procedure is invoked when the last character of space
  133.  *    in a stream's buffer is filled.  Its job is to write out the
  134.  *    contents of the buffer to the file system.  This procedure is
  135.  *    used for all streams that are associated with files (or pipes,
  136.  *    or anything for which the file-related system calls apply).
  137.  *
  138.  * Results:
  139.  *    None.
  140.  *
  141.  * Side effects:
  142.  *    If the buffer is REALLY full (which it isn't the first time
  143.  *    a byte is written to stdOut or stdErr:  we fake a full
  144.  *    condition to ensure that this procedure gets called so it
  145.  *    can do initialization), then the bytes in stream's buffer
  146.  *    are written to the stream's file.  The status and end-of-file
  147.  *    fields in stream are set if any problems occur.
  148.  *
  149.  *----------------------------------------------------------------------
  150.  */
  151.  
  152. void
  153. StdioFileWriteProc(stream, flush)
  154.     register FILE *stream;    /* Stream whose buffer needs to be emptied.
  155.                  * The stream must be writable.  The clientData
  156.                  * field of stream gives a stream index to
  157.                  * pass to the operating system. */
  158.     int flush;            /* Non-zero means it's important to really
  159.                  * write everything out.  Otherwise, this
  160.                  * procedure only needs to write things if
  161.                  * the buffer is full. */
  162. {
  163.     int count;
  164.  
  165.     /*
  166.      * If this stream doesn't have a buffer associated with it, create
  167.      * a new one, and retrieve the character just written (it was put in
  168.      * stdioTempBuffer).
  169.      */
  170.  
  171.     if (stream->bufSize == 0) {
  172.     stream->bufSize = BUFSIZ;
  173.     if ((stream == stderr) || (stream == stdout)) {
  174.         if (isatty((int) stream->clientData)) {
  175.         stream->flags |= STDIO_LINEBUF;
  176.         }
  177.     }
  178.     if (stream != stderr) {
  179.         stream->buffer = (unsigned char *) 
  180.             malloc((unsigned) stream->bufSize);
  181.     } else { 
  182.         stream->buffer = stdioStderrBuffer;
  183.         stream->bufSize = 128;
  184.     }
  185.     stream->lastAccess = stream->buffer;
  186.     *stream->buffer = stdioTempBuffer[0];
  187.     }
  188.  
  189.     count = stream->lastAccess + 1 - stream->buffer;
  190.     if ((count  == stream->bufSize) || flush) {
  191.     int    written;
  192.     stream->lastAccess = stream->buffer - 1;
  193.     do {
  194.         written = write((int) stream->clientData, (char *) stream->buffer, 
  195.         count);
  196.         if (written <= 0 ) {
  197.         stream->writeCount = 0;
  198.         stream->status = errno;
  199.         return;
  200.         }
  201.         count = count - written;
  202.     } while (count > 0);
  203.     stream->lastAccess = stream->buffer - 1;
  204.     stream->writeCount = stream->bufSize;
  205.     } else {
  206.     stream->writeCount = stream->bufSize - count;
  207.     }
  208. }
  209. @
  210.  
  211.  
  212. 1.7.1.1
  213. log
  214. @Initial branch for Sprite server.
  215. @
  216. text
  217. @d17 1
  218. a17 1
  219. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileWriteProc.c,v 1.7 90/09/11 14:27:21 kupfer Exp $ SPRITE (Berkeley)"; 
  220. @
  221.  
  222.  
  223. 1.6
  224. log
  225. @handles short writes
  226. @
  227. text
  228. @d17 1
  229. a17 1
  230. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/StdioFileWriteProc.c,v 1.5 89/06/19 14:15:12 jhh Exp Locker: jhh $ SPRITE (Berkeley)"; 
  231. d24 1
  232. @
  233.  
  234.  
  235. 1.5
  236. log
  237. @Made stderr buffer static
  238. @
  239. text
  240. @d17 1
  241. a17 1
  242. static char rcsid[] = "$Header: StdioFileWriteProc.c,v 1.4 88/07/28 17:18:31 ouster Exp $ SPRITE (Berkeley)"; 
  243. d132 1
  244. d134 10
  245. a143 6
  246.     if (write((int) stream->clientData, (char *) stream->buffer, count)
  247.         != count) {
  248.         stream->writeCount = 0;
  249.         stream->status = errno;
  250.         return;
  251.     }
  252. @
  253.  
  254.  
  255. 1.4
  256. log
  257. @More lint.
  258. @
  259. text
  260. @d17 1
  261. a17 1
  262. static char rcsid[] = "$Header: StdioFileWriteProc.c,v 1.3 88/07/25 14:12:40 ouster Exp $ SPRITE (Berkeley)"; 
  263. d26 1
  264. a26 1
  265.  * Before the first I/O on stdin, stdout, or stderr, their buffers
  266. d35 8
  267. d118 7
  268. a124 3
  269.         if (stream == stderr) {
  270.         stream->bufSize = 128;
  271.         }
  272. a125 1
  273.     stream->buffer = (unsigned char *) malloc((unsigned) stream->bufSize);
  274. @
  275.  
  276.  
  277. 1.3
  278. log
  279. @Lint.
  280. @
  281. text
  282. @d17 1
  283. a17 1
  284. static char rcsid[] = "$Header: StdioFileWriteProc.c,v 1.2 88/07/20 18:12:12 ouster Exp $ SPRITE (Berkeley)"; 
  285. d114 1
  286. a114 1
  287.     stream->buffer = (unsigned char *) malloc(stream->bufSize);
  288. @
  289.  
  290.  
  291. 1.2
  292. log
  293. @Change file streams so that fdopen can be called more than once
  294. for a given stream id, and get separate buffers.
  295. @
  296. text
  297. @d17 1
  298. a17 1
  299. static char rcsid[] = "$Header: StdioFileWriteProc.c,v 1.1 88/06/10 16:23:33 ouster Exp $ SPRITE (Berkeley)"; 
  300. d96 1
  301. a96 1
  302.     int count, bytesWritten;
  303. @
  304.  
  305.  
  306. 1.1
  307. log
  308. @Initial revision
  309. @
  310. text
  311. @d17 1
  312. a17 1
  313. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)"; 
  314. d43 1
  315. a43 1
  316.     (ClientData) 0, 0, STDIO_READ
  317. d49 1
  318. a49 1
  319.     (ClientData) 1, 0, STDIO_WRITE
  320. d55 1
  321. a55 1
  322.     (ClientData) 2, 0, STDIO_WRITE
  323. d58 1
  324. a58 4
  325. int        stdioNumFileStreams        = INIT_NUM_STREAMS;
  326. static FILE *    initStreams[INIT_NUM_STREAMS]    = {&stdioInFile,
  327.     &stdioOutFile, &stdioErrFile};
  328. FILE **        stdioFileStreams        = initStreams;
  329. @
  330.